package Tool;

import java.lang.reflect.Constructor;
import java.util.*;

import Test.Exception.FactoryException;

public class ObjectFactory <T>{
	/** 类型-构造函数对应表 */
	protected AbstractMap<Integer, Constructor<? extends T>> 
		classMap = new TreeMap<Integer, Constructor<? extends T>>();

	/** 类型-名字对应表 */
	protected AbstractMap<Integer, String> nameMap = new TreeMap<Integer, String>();
	
	/**
	 * 注册或更新一个继承自T的类，一定要实现public (argTypes args)构造函数接口
	 * @param type	题型
	 * @param clss	要注册的类
	 */
	public void updateClassMap(int type, Class<? extends T> clss, String name) throws FactoryException{
		try{
			classMap.put(type, clss.getConstructor());
			nameMap.put(type, name);
		}
		catch (Exception e){
			throw new FactoryException(e.getMessage());
		}
	}
	
	/**
	 * 创建Object实例
	 * @param type		类型
	 * @return			type对应的实例
	 * @throws FactoryException		创建类失败
	 */
	public T createObject(Integer type) throws FactoryException {
		Constructor<? extends T> cons = classMap.get(type);
		if (cons == null) throw new FactoryException("未注册此类：" + type);
		try{
			return cons.newInstance();
		}
		catch (Exception e){
			throw new FactoryException(e.getMessage());
		}
	}
	
	/**
	 * 得到所有类型码
	 */
	public Collection<Integer> getAllType(){
		return nameMap.keySet();
	}
	
	/**
	 * 得到某一类型对应的类型名
	 * 找不到返回null，如果注册时填null也返回null
	 */
	public String getName(int type){
		return nameMap.get(type);
	}
}







